#include "folder.h"
#include <QDebug>
#include <QMessageBox>
Folder::Folder( Folder* parent, QString parentPath, Ui::MainWindow *p_ui)
    : QTreeWidgetItem()
{
    path = parentPath + "/";

    ui   = p_ui;

    type = "Folder";

    parentFolder = parent;
}

bool Folder::loadInfo(QFile *infoFile)
{
    qDebug() << "-------------------------------";
    QString *tempString   = new QString;
    QString *variableName = new QString;
    QString *value        = new QString  ;

    while( true)
    {
        *tempString = infoFile->readLine();  // Получение строки из файла
        *tempString = tempString->trimmed();  // Удаление лишних пробелов

        if(tempString->isEmpty())    // Если строка пуста пропустить её
            continue;

        *variableName = "";
        *value = "";
         Revoice::setVarNValue(*tempString, *variableName, *value);  // Разбивает *tempString на имя переменной и значение


        if( *variableName == "name")
        {
            name = *value;   // Присвоение имени папки
            path += name;   // Присвоение пути к папке
            qDebug() << "Folder::loadInfo(): Создается папка " << path.toStdString().c_str();

            setText(0, name);
        }
        else if( *variableName == "commentary")
        {
            commentary = *value;
            setToolTip(0, commentary);
        }
        else if( *variableName == "iconStyle")
        {
            iconStyle = value->toInt();
            setIcon(0, QIcon(QString(":/icons/folder/%1.png").arg(*value)));    // Загружаем оттуда иконку. Иконки папок имеют имена от 0.png - 6.png
        }
        else if( *variableName == "tag")
        {
            addTag( *value );
        }
        else if( *variableName == "[Folder]")
        {
            qDebug( QString("Folder::loadInfo(): Обнаружена дочерняя папка в папке %1.").arg(name).toStdString().c_str());
            Folder *temp = new Folder(this, path, ui);
            temp->loadInfo(infoFile);

            addChild(temp);

            folders.push_back(temp);
        }
        else if( *variableName == "[Sound]")
        {
            SoundFile* temp = new SoundFile( path, (QTreeWidgetItem*) this, ui);
            if( !temp->loadInfo(infoFile))
                return false;

            files.push_back(temp);
        }
        else if( *variableName == "[end]")
        {            
            updateFolderView();

            /* ---- Получение списка тегов из реестра и добавление к ним отсутствующих--- */
            QStringList *tagList = new QStringList;
            QSettings *settings  = new QSettings("Cydeamon's Projects", "Gameloc");

            *tagList = settings->value("tags").toStringList();

            bool alreadyHave;
            for( int i = 0; i < tags.count(); i++)
            {
                alreadyHave = false;

                for( int j = 0; j < tagList->count(); j++)
                    if( tagList->at(j) == tags.at(i))
                        alreadyHave = true;

                if( !alreadyHave )
                    tagList->push_back(tags.at(i));
            }

            settings->setValue("tags", *tagList);

            delete settings;
            delete tagList;

            delete tempString;
            delete variableName;
            delete value;

            return true;
        }
        else
        {
            QMessageBox::warning(new QWidget(), "Ошибка", QString("Обнаружена неизвестная переменная %1 при загрузке папки %2. Класс: Folder, функция: loadInfo()").arg(*variableName, name),
                                 QMessageBox::Ok);

            return false;
        }
    }
}

void Folder::showFilesInTree(QTreeWidgetItem* item)
{
    ui->fileTree->clear();

    Folder* treeItem = (Folder*) item;

    if( treeItem->type == "Folder")
    {
        qDebug() << "Folder::showFilesInTree(): " << treeItem->type << " == Folder";
        qDebug() << "Folder::showFilesInTree(): Создаю копию данных и добавляю элементы в fileTree. Папка: " << treeItem->name.toStdString().c_str();

        QVector <SoundFile*> soundsCopy;
        SoundFile* soundCopy;
        for( int i = 0; i < treeItem->files.count(); i++)       // Создание копии списка звуковых файлов из объекта папки
        {
            soundCopy =  new SoundFile(treeItem->path, (QTreeWidgetItem*) this, ui);
            treeItem->files.at(i)->makeCopy(soundCopy); // Данные копируются в soundCopy

            soundsCopy.push_back(soundCopy);
        }                                                       // Их представление в виджете
        for( int i = 0; i < soundsCopy.size(); i++)
            ui->fileTree->addTopLevelItem(soundsCopy.at(i));
    }
}

void Folder::makeCopy(Folder *copy)
{
    qDebug() << "Folder::makeCopy(): Вызван конструктор копии Folder. Создается копия объекта класса Folder ссылающегося на папку " << name.toStdString().c_str();

    // Копирование элементов неуказателей
    copy->commentary = commentary;
    copy->name       = name;
    copy->path       = path;
    copy->type       = type;
    qDebug() << "Folder::makeCopy(): Простые элементы скопированны успешно";

    // Копирование динамически инициализированных элементов
    // Копирование files

    SoundFile *soundCopy;    // Копия файла.
    for( int i = 0; i < files.size(); i++)
    {
        soundCopy = new SoundFile(path, (QTreeWidgetItem*) this, ui);
        files.at(i)->makeCopy(soundCopy);

        copy->files.push_back( soundCopy );
        qDebug() << "Folder::makeCopy(): Копия файла " << soundCopy->getName().toStdString().c_str() << " создана успешно";
    }
    // Копирование folders
    qDebug() << "Folder::makeCopy(): Создаю копию содержащихся папок";
    Folder* folderCopy;
    for( int i = 0; i < folders.size(); i++)
    {
        folderCopy  = new Folder(this, path, ui);
        folders.at(i)->makeCopy(folderCopy);
        copy->folders.push_back(folderCopy);
        qDebug() << "Folder::makeCopy(): Копия папки " << folderCopy->name.toStdString().c_str() << " создана успешно";
    }
    qDebug() << "Folder::makeCopy(): Выхожу из конструктора копии Folders";
}

void Folder::updateFolderView()
{
    setIcon(0, QIcon(tr(":/icons/folder/%1.png").arg(iconStyle)));
    setToolTip(0, commentary);

    if( tags.count() > 0 )
    {
        setToolTip(0, toolTip(0) + "\nТеги: ");
        for(int i = 0; i < tags.count();i++)
        {
           setToolTip(0, toolTip(0) + tags.at(i));

           if( i != tags.count() - 1 )
               setToolTip(0, toolTip(0) + ", ");
        }
    }
}

